package com.im.common.netty.my.codec;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.util.List;

/**
 * 私有协议解码器
 */
public class PrivateProtocolDecoder extends ByteToMessageDecoder {

    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List<Object> out) throws Exception {
        // 如果可读字节数小于4，说明数据不足，返回等待更多的数据
        if (msg.readableBytes() < 4) {
            return;
        }
        // 标记读取位置
        msg.markReaderIndex();
        // 读取协议头中的长度信息
        int length = msg.readInt();
        // 如果可读字节数小于协议体的长度，说明数据不足，返回等待更多的数据
        if (msg.readableBytes() < length) {
            // 重置读取位置
            msg.resetReaderIndex();
            return;
        }
        // 读取协议体
        byte[] body = new byte[length];
        msg.readBytes(body);
        System.out.println(new String(body));
        // 封装成PrivateProtocol对象，添加到解码器的输出列表中
        PrivateProtocol privateProtocol = new PrivateProtocol(body);
        out.add(privateProtocol);
    }

}
